iT邦幫忙

2022 iThome 鐵人賽

DAY 9
0

昨天 Hugging Face 裡透過 Arrow 和 Stream 兩種機制,讓我們可以有效率的來操作資料,今天我們就來看看 Stream 的部份吧

Stream 超巨大的 dataset

Hugging Face Library 提供了一個 Stream 的功能,讓你可以串流你的 dataset,會回傳一個 IterableDataset,讓你可以迭代它。

  1. 要啟用 Stream mode 很簡單,可以用下面的程式碼來啟用。
nih_dataset_streamed = load_dataset(
    "json", data_files=data_files, split="train", streaming=True
)
  1. 如下圖,我們這時候無法直接在 Notebook 裡印出 data 的資訊,只會印出一個記憶體位置,我們要用 next(iter(nih_dataset_streamed)) 才有辦法印出來。

koko hugging face in azure machine learning-- dataset the pile

  1. 同樣地,你也可以把 IterableDataset 做 shuffle 。
shuffled_dataset = nih_dataset_streamed.shuffle(buffer_size=10_000, seed=5566)
next(iter(shuffled_dataset))
  1. 我們在操作原本的 dataset 的時候,可以用 set_format 轉成 pandas ,不過這就不適用 streamed dataset 了。

  2. 還有 filter 和 take 可以用

nih_dataset_streamed = nih_dataset_streamed.filter(lambda x: x["meta"]["APPLICATION_ID"] >= 1000)
list(nih_dataset_streamed.take(3))
  1. 也可以 skip
skipped_dataset = nih_dataset_streamed.skip(1000)
  1. 還有一個超好用的 API 是 interleave_datasets,這個可以把兩個 datasets 合併在一起,無論是 Dataset 還是 IterableDataset 都可以合併,但是一般用在 IterableDataset 的 dataset 合併,效能更佳。
from datasets import interleave_datasets
combined_dataset = interleave_datasets([nih_dataset_streamed, other_dataset_streamed])
  1. 如果你要一口氣 Stream The Pile 的一大堆的 datasets 也是可以的,Hugging Face 官方提供了下列的程式碼。不過等待的時間很恐怖就是了...。
base_url = "https://mystic.the-eye.eu/public/AI/pile/"
data_files = {
    "train": [base_url + "train/" + f"{idx:02d}.jsonl.zst" for idx in range(30)],
    "validation": base_url + "val.jsonl.zst",
    "test": base_url + "test.jsonl.zst",
}
pile_dataset = load_dataset("json", data_files=data_files, streaming=True)
next(iter(pile_dataset["train"]))

明天開始我們就來進入 Tokenizer 的部份吧!!


上一篇
# Day8-載入極巨大的 Dataset -- Arrow 篇
下一篇
# Day10-Tokenizer 入門
系列文
變形金剛與抱臉怪---NLP 應用開發之實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言